package com.molichuxing.services.infrastructure.service;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.infrastructure.dto.request.create.OrderEnterpriseCreateDto;
import com.molichuxing.services.infrastructure.dto.response.OrderEnterpriseDto;
import com.molichuxing.services.property.EnterpriseStateEnum;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 企业订单
 *
 * @Author zoumingyu
 * @Date 2020年06月04日
 */
public interface OrderEnterpriseService extends RootService {

    /**
     * 获取企业订单
     *
     * @param orderCode 订单号
     * @return OrderEnterpriseDto
     */
    OrderEnterpriseDto getEnterprise(Long orderCode);

    /**
     * 获取企业订单
     *
     * @param orderCodes 订单号list
     * @return List
     */
    List<OrderEnterpriseDto> getEnterpriseList(List<Long> orderCodes);

    /**
     * 获取企业订单
     *
     * @param orderCodes 订单号list
     * @return Map
     */
    Map<Long, OrderEnterpriseDto> getEnterpriseMap(List<Long> orderCodes);

    /**
     * 存在企业订单信息
     *
     * @param createDto
     * @return Integer 企业订单id
     */
    Integer create(OrderEnterpriseCreateDto createDto);

    /**
     * 续订修改主订单
     *
     * @param orderCode 订单号
     * @return
     */
    boolean modifyHaveSuborder(Long orderCode);

    /**
     * 修改订单状态
     *
     * @param orderCode 订单号
     * @param oldState  旧状态
     * @param newState  新状态
     * @return
     */
    boolean modifyState(Long orderCode, EnterpriseStateEnum oldState, EnterpriseStateEnum newState);

    /**
     * 查询固定日订单
     *
     * @param dayInt
     * @param localDate
     * @return
     */
    List<OrderEnterpriseDto> listOrderEnterpriseByDay(List<Integer> dayInt, LocalDate localDate);

    /**
     * 获取各状态下的订单数量
     * @param params
     * @return
     */
    Integer getCount(Map<String, Object> params);

    /**
     * 分页查询企业订单信息
     *
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    Paged<OrderEnterpriseDto> getOrderList(Map<String, Object> params, int pageNum, int pageSize)
            throws Exception;

    /**
     * 根据企业ID获取订单列表
     *
     * @param enterpriseId
     * @return
     */
    List<OrderEnterpriseDto> getByEnterpriseId(Integer enterpriseId);

    /**
     * 根据起租日、截止日查询订单code集合
     *
     * @param params
     * @return
     */
    Set<Long> getByDate(Map<String, Object> params);

    /**
     * 根据父订单号获取子订单
     *
     * @param enterpriseOrderCodes
     * @return
     */
    Map<Long, Long> getOrderCodeByParentOrderCodes(List<Long> enterpriseOrderCodes);

    /**
     * 查询到期订单
     *
     * @param leaseExpire 到期时间
     * @return
     */
    List<OrderEnterpriseDto> getExpire(LocalDate leaseExpire);

    /**
     * 查询企业订单信息
     *
     * @param parentOrderCode 父订单号
     * @return
     */
    OrderEnterpriseDto getEnterpriseByParentOrderCode(Long parentOrderCode);

    /**
     * 获取续订单信息
     *
     * @param leaseInception 起租日
     * @return
     */
    List<OrderEnterpriseDto> getRenewLease(LocalDate leaseInception);

    /**
     *
     * @param orderCode
     * @param oldState
     * @param newState
     * @param leaseInceptio
     * @param leaseExpire
     */
    Integer modifyLeaseConfirm(Long orderCode,Integer oldState, Integer newState, LocalDate leaseInceptio, LocalDate leaseExpire);

}
